﻿// Spun AJAX Framework
// Copyright (C) 2008 Blake Hegerle
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace Spun.Communications.Hosting
{
    public class ContentServer : IServer
    {
        #region IServer Members

        public void ProcessRequest(HttpListenerContext Context, string RelativePath)
        {
            var File = new FileInfo(RelativePath);

            using (var Stream = File.Open(FileMode.Open))
            {
                Context.Response.ContentType = ContentType(File, Context);
                Context.Response.ContentLength64 = Stream.Length;

                var Buffer = new byte[1000];
                int BytesRead;
                while ((BytesRead = Stream.Read(Buffer, 0, Buffer.Length)) > 0)
                    Context.Response.OutputStream.Write(Buffer, 0, BytesRead);

                Context.Response.StatusCode = 200;
                Context.Response.Close();
            }
        }

        #endregion

        private string ContentType(FileInfo File, HttpListenerContext Context)
        {
            var Extension = File.Extension.ToLower().TrimStart('.');

            switch (Extension)
            {
                case "htm":
                case "html":
                    return "text/html";
                case "css":
                    return "text/css";
                case "gif":
                    return "image/gif";
                case "png":
                    return "image/x-png";
                case "jpeg":
                case "jpg":
                case "jpe":
                    return "image/jpeg";
                case "pdf":
                    return "application/x-pdf";
                case "js":
                    return "application/x-javascript";
                default:
                    throw new Exception("Don't know content type for " + Extension);
            }
        }
    }
}
